import java.io.IOException;

import javax.naming.NamingException;
import javax.servlet.*;
import javax.servlet.http.*;

import java.net.*;
import java.sql.*;

import org.apache.log4j.Logger;

import db.QueryManager;
import db.CommonConnect;
import db.DAO;

import command.Command;
import command.CommandException;
import command.CommandManager;
import common.CommonUtil;
import common.UserSession;
import common.ConfigEntity;

/**
 *
 * 메인서블릿. 해당 웹어플리케이션의 모든 호출을 받는다.
 */

public class MainServlet extends HttpServlet {

	private static final long serialVersionUID = 1L;

	private String ERROR_PAGE = "/jsp/msg/error_all.jsp"; // 문자형 변수 error에 에러페이지
														// 주소 값 대입.

	protected static Logger logger  = Logger.getLogger(MainServlet.class);


	public void init(ServletConfig config) throws ServletException { // 서블릿 호출시 처음 한번만 실행되는 메서드.

		super.init(config);

		QueryManager.initQueryFile(getServletContext().getRealPath("/")	+ "WEB-INF");
		CommandManager.initCommandsFree();
		CommandManager.initCommands();
	}

	/**
	 *
	 * 실제 요청을 받아 처리하는 메소드
	 *
	 * 요청을 받으면 해당 Command를 호출하여 요청을 처리하고 next 페이지로 이동함
	 *
	 * @param req
	 *            HttpServletRequest
	 *
	 * @param res
	 *            HttpServletResponse
	 */
	 // 실제 서비스 하는 메서드.
	public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException
	{
		String  v_cmd, next	= "";	// 문자형 변수 v_cmd와 index주소값 대입한 next라는 변수 선언.
		Command cmd 		= null;	// Command 클래스의 객체 cmd의 초기값은 널. 
		String  url			= (String) req.getServerName().trim().replace("http://", "");

        ConfigEntity configEntity = new ConfigEntity(); // Config 정보 가져오기 
        
		boolean debug		= true;
        boolean isMainDomain= false;

		if(debug) {
	        String start_date   = CommonUtil.getToday("yyyy.MM.dd hh:mm:ss");
			System.out.println("## [START: "+start_date+"]================================");
			System.out.println("---- Service Start [" + url + "] ----");
		}

    	
		//## 메인 도메인 접근유무 확인 [configuration] START
		String mainDomain     = "";
    	String testMainDomain = "";
    	
		for ( int i = 0; i < (configEntity.enableMainDomain).length; i++ ) {
			mainDomain     = configEntity.enableMainDomain[i];
			testMainDomain = configEntity.testDomainPrefix + configEntity.enableMainDomain[i];
				
        	if ( url.equalsIgnoreCase(mainDomain.trim()) 
        			|| url.equalsIgnoreCase(testMainDomain.trim()) ) {
            	isMainDomain = true;
            } 
        }
    	//## 메인 도메인 접근유무 확인 [configuration] END
		
		
		if(debug) System.out.println("     : 관리자 영역  isMainDomain=====>"+isMainDomain);

		if(isMainDomain){
			try{
				next = "index.jsp";
				//serverlet로 넘어온게 아니면 팅겨내기 *.* web.xml에 걸기
				//전체 url 알아내서 다른파일로 온거면 팅기기
				//해보니깐 안됨
				//모든 jsp파일에 include해서 uri가 speaking.pb가 아니면 오류 내기
				System.out.println("servername=>"+req.getServerName()+"  serpathuri"+req.getRequestURI());
	
				req.setCharacterEncoding("utf-8");
	
				v_cmd = req.getParameter("cmd"); // v_cmd에 cmd에 받아온 값을 대입.
	
				if(debug) System.out.println("     : lookupCommand [ " + v_cmd + " ]");	
				cmd = CommandManager.lookupCommand(v_cmd, req); // v_cmd를 lookupCommand메서드에 넣어서 cmd에 대입.
	
				HttpSession session     = req.getSession(true); // session 에는 받아온 세션값 넣음..
				UserSession userSession = (UserSession) session.getAttribute("user");
				String      userId      = (userSession==null) ? "Guest": userSession.getUser_id();
				String      use_level      = (userSession==null) ? "0": userSession.getAdmin_level();
				if(debug) System.out.println("     : User ID [ "+ userId +" ] ");
				
				next = cmd.execute(req); // next에 cmd를 execute한 값을 대입.
				if(debug) System.out.println("     : Next Page [ "+ next +" ] ");
	
		    	String userIP           = req.getRemoteAddr();
				if(debug) System.out.println("     : User IP [ "+ userIP +" ] ");
				
				Connection con=null;
				
				String[] param = new String[5];
				param[0]=userId;
				param[1]=use_level;
				param[2]="";
				param[3]=next;
				param[4]=userIP;				
				
				if(debug) System.out.println("     : MEMBER LOG INSERT START ## ");	
				try {
					con = (new CommonConnect()).getConnection_ds2();
					con.setAutoCommit(false);
					String queryStr =  QueryManager.getQuery("user_loging.write");
					DAO userdao = new DAO();
					userdao.update(con,queryStr,param);
					if(debug) System.out.println("     : MEMBER LOG INSERT END ## ");
				} catch (SQLException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (NamingException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (ClassNotFoundException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (Exception ex) {
					try{
						con.rollback();
					}catch(Exception ee){}
					throw new CommandException(ex.getMessage());
				}finally {
					try{
						if (con!=null) con.setAutoCommit(true);
						if (con!=null) con.close();
					}catch(Exception ee){}
				}
			} catch (CommandException e) {
				e.printStackTrace();
				req.setAttribute("javax.servlet.jsp.jspException", e);
				HttpSession session = req.getSession(true); // session 에는 받아온 세션값 넣음..
				String ERROR_TYPE = (String) session.getAttribute("ERROR_TYPE");
				if (ERROR_TYPE.equals("DOMAIN")){
					next = "/jsp/msg/error_domain.jsp";
				}else if (ERROR_TYPE.equals("COOKIE")){
					next = "/jsp/msg/error_cookie.jsp";
				}else{
					next = ERROR_PAGE;
				}
			}
		}else{
			next = "/jsp/msg/error_domain.jsp";
		}

		RequestDispatcher rd; // 분기해주는 객체.. next로 가라고 지시함..
		rd = getServletContext().getRequestDispatcher(next);
		if(debug) {
	        String end_date   = CommonUtil.getToday("yyyy.MM.dd hh:mm:ss");			
			System.out.println("## [END: "+end_date+"]==================================");
		}
		
		rd.forward(req, res);
	}
}
